/**
 * Android RPG Miyagi Quest<br>
 * <br>
 * Copyright (c) CGENE Inc. All Right Reserved.<br>
 * http://cgene.jp/<br>
 * <br>
 * [変更履歴]<br>
 * 2009/11/25 初版 v1.0.0<br>
 * 2010/11/19 タッチパネル対応 v1.0.1 K.Imamura<br>
 *
 * 2012/02/08 ミヤギクエストとして再編 v2.0.0 S.Ozawa<br>
 * 2012/02/08 Enemyクラスを独立ファイルに v2.0.0 S.Ozawa<br>
 * 2012/02/08 EnemyComparaterクラスを独立ファイルに v2.0.0 S.Ozawa<br>
 * 2012/02/08 MiyagiQuestViewクラスを独立ファイルに v2.0.0 S.Ozawa<br>
 */
package com.cgene.game;

import java.io.*;
import java.lang.reflect.Field;
import java.util.*;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.*;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.MotionEvent;
import android.view.GestureDetector;
import android.util.DisplayMetrics;

import android.util.Log;

import android.view.Display;
import android.view.WindowManager;

import android.media.*;

/**
 * RPG起動のActivityクラス
 * @author H.Yanagawa
 */
public class MiyagiQuest extends Activity
					implements GestureDetector.OnGestureListener{
	/**	定期処理ハンドラ変数 */
	private TickHandler tickHandler;

	/**	ゲーム表示用 view 変数 */
	private MiyagiQuestView view;
    GestureDetector mGestureDetector;
	private int TouchPosX_Down = 0;			//	画面タッチ時のx座標
	private int TouchPosY_Down = 0;			//	画面タッチ時ののy座標
	private int TouchPosX_Move = 0;			//	画面長押し時のx座標
	private int TouchPosY_Move = 0;			//	画面長押し時ののy座標
	@SuppressWarnings("unused")
	private int TouchPosX_UP = 0;			//	画面リリース時のx座標
	@SuppressWarnings("unused")
	private int TouchPosY_UP = 0;			//	画面リリース時のy座標
	private int TouchPosX_Fling = 0;		//	画面フリック時のx座標
	private int TouchPosY_Fling = 0;		//	画面フリック時のy座標

	/**
     * Called when the activity is first created.
	 * Androidが、一番初めに実行する際に呼び出させる処理
	 */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        view = new MiyagiQuestView(getApplication(), this);

		// 端末のディスプレイ情報取得
        WindowManager windowManager = getWindowManager();
		Display display = windowManager.getDefaultDisplay();

		DisplayMetrics displayMetrics = new DisplayMetrics();
		display.getMetrics(displayMetrics);

        mGestureDetector = new GestureDetector(this);

        setContentView(view);
    }

    /*
     *	タッチ時処理
     */
	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		DebugLog.printin("onTouchEvent IN");

        //ジェスチャーディテクターの処理
        mGestureDetector.onTouchEvent(event);

        String action = "";

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            action = "ACTION_DOWN";
            break;
        case MotionEvent.ACTION_UP:
            action = "ACTION_UP";
			view.Flag_LongTouch = false;
            break;
        case MotionEvent.ACTION_MOVE:
            action = "ACTION_MOVE";
            break;
        case MotionEvent.ACTION_CANCEL:
            action = "ACTION_CANCEL";
            break;
        }
        Log.v("MotionEvent", "view.TouchStatus = "
        					+ String.valueOf(view.TouchStatus));
        return true;
    }

    /**
     *	ダウン時処理
     */
    public boolean onDown(MotionEvent e)
	{
        DebugLog.printin("Down("+(int)e.getX()+","+(int)e.getY()+")");
		TouchPosX_Down = (int)e.getX();
		TouchPosY_Down = (int)e.getY();
        return false;
    }

    /**
     *	長押し時処理
     */
    public void onLongPress(MotionEvent e)
	{
    	/**
        DebugLog.printin("LongPress("+(int)e.getX()+","+(int)e.getY()+")");

        //	画面長押し中の座標を取得
		TouchPosX_Move = (int)e.getX();
		TouchPosY_Move = (int)e.getY();

		//	長押し位置のY座標が高さの中心点よりも上、かつ、
		//	X座標が両幅から1/3以内であれば、上スライドとして扱う
		if(TouchPosY_Move < ((view.displayHeight / 3))){
			DebugLog.printin("LongPress:TouchStatus_UP");
			view.TouchStatus = view.TouchStatus_UP;
			view.Flag_LongTouch = true;
		//	長押し位置のY座標が高さの中心点よりも下、かつ、
		//	X座標が両幅から1/4以内であれば、下スライドとして扱う
		} else if(TouchPosY_Move > ((view.displayHeight / 3) * 2)) {
			DebugLog.printin("LongPress:TouchStatus_DOWN");
			view.TouchStatus = view.TouchStatus_DOWN;
			view.Flag_LongTouch = true;
		//	長押し位置のX座標が幅の中心点よりも左、かつ、
		//	Y座標が上下1/3以内であれば、左スライドとして扱う
		} else if(TouchPosX_Move < ((view.displayWidth / 3))) {
			DebugLog.printin("LongPress:TouchStatus_LEFT");
			view.TouchStatus = view.TouchStatus_LEFT;
			view.Flag_LongTouch = true;
		//	長押し位置のX座標が幅の中心点よりも右、かつ、
		//	Y座標が上下1/3以内であれば、右スライドとして扱う
		} else if(TouchPosX_Move > ((view.displayWidth / 3) * 2)) {
			DebugLog.printin("LongPress:TouchStatus_RIGHT");
			view.TouchStatus = view.TouchStatus_RIGHT;
			view.Flag_LongTouch = true;
		}
   	    DebugLog.printin(
             "x = " + String.valueOf(e.getX()) + ", " +
             "y = " + String.valueOf(e.getY()) + ", " +
             "TouchPosX_Move = " + String.valueOf(TouchPosX_Move) + ", " +
             "TouchPosY_Move = " + String.valueOf(TouchPosY_Move) + ", " +
             "view.TouchStatus = " + String.valueOf(view.TouchStatus));
             */
    }

    /**
     *	フリック時処理
     */
    public boolean onFling(MotionEvent e0,MotionEvent e1,
    							float velocityX,float velocityY)
	{
		DebugLog.printin("Fling("+(int)velocityX+","+(int)velocityY+")");
		TouchPosX_Fling = (int)e1.getX();
		TouchPosY_Fling = (int)e1.getY();

		// タッチ⇒リリース時のX座標差異が+40以上の場合、上スライドとして扱う
		if((TouchPosY_Down- TouchPosY_Fling) >= 40) {
			view.TouchStatus = view.TouchStatus_UP;
	        return false;
		// タッチ⇒リリース時のX座標差異が-40以下の場合、下スライドとして扱う
		} else if((TouchPosY_Down - TouchPosY_Fling) <= -40) {
			view.TouchStatus = view.TouchStatus_DOWN;
	        return false;
		// タッチ⇒リリース時のY座標差異が30以上の場合、左スライドとして扱う
		} else if((TouchPosX_Down - TouchPosX_Fling) >= 30) {
			view.TouchStatus = view.TouchStatus_LEFT;
	        return false;
		// タッチ⇒リリース時のY座標差異が-30以下の場合、右スライドとして扱う
		} else if((TouchPosX_Down - TouchPosX_Fling) <= -30) {
			view.TouchStatus = view.TouchStatus_RIGHT;
	        return false;
		}
        return false;
    }

    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) { // キーが離された時
            switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_DPAD_UP:
            	view.TouchStatus = view.TouchStatus_UP;
            	return false;
            case KeyEvent.KEYCODE_DPAD_DOWN:
            	view.TouchStatus = view.TouchStatus_DOWN;
            	return false;
            case KeyEvent.KEYCODE_DPAD_LEFT:
            	view.TouchStatus = view.TouchStatus_LEFT;
            	return false;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
            	view.TouchStatus = view.TouchStatus_RIGHT;
            	return false;
            case KeyEvent.KEYCODE_DPAD_CENTER:
            	view.TouchStatus = view.TouchStatus_TAP;
            default:
            }
        }
        return super.dispatchKeyEvent(event);
    }

    /**
     *	スクロール時処理
     */
    public boolean onScroll(MotionEvent e0,MotionEvent e1,
    							float distanceX,float distanceY)
	{
    	/**
        DebugLog.printin("Scroll("+(int)distanceX+","+(int)distanceY+")");
        DebugLog.printin("Scroll_e0("+(int)e0.getX()+","+(int)e0.getY()+")");
        DebugLog.printin("Scroll_e1("+(int)e1.getX()+","+(int)e1.getY()+")");

        // 画面長押し中の座標を取得
		TouchPosX_Move = (int)e1.getX();
		TouchPosY_Move = (int)e1.getY();

		// 長押し位置のY座標が高さの中心点よりも上、かつ、
		// X座標が両幅から1/3以内であれば、上スライドとして扱う
		if(TouchPosY_Move < ((view.displayHeight / 3))) {
			view.TouchStatus = view.TouchStatus_UP;
			view.Flag_LongTouch = true;
			view.sleep(100);		// 移動速度調整のためスリープ
		// 長押し位置のY座標が高さの中心点よりも下、かつ、
		// X座標が両幅から1/4以内であれば、下スライドとして扱う
		} else if(TouchPosY_Move > ((view.displayHeight / 3) * 2 )) {
			view.TouchStatus = view.TouchStatus_DOWN;
			view.Flag_LongTouch = true;
			view.sleep(100);		// 移動速度調整のためスリープ
		// 長押し位置のX座標が幅の中心点よりも左、かつ、
		// Y座標が上下1/3以内であれば、左スライドとして扱う
		} else if( TouchPosX_Move < ((view.displayWidth / 3))) {
			view.TouchStatus = view.TouchStatus_LEFT;
			view.Flag_LongTouch = true;
			view.sleep(100);		// 移動速度調整のためスリープ
		// 長押し位置のX座標が幅の中心点よりも右、かつ、
		// Y座標が上下1/3以内であれば、右スライドとして扱う
		} else if( TouchPosX_Move > ((view.displayWidth / 3) * 2)) {
			view.TouchStatus = view.TouchStatus_RIGHT;
			view.Flag_LongTouch = true;
			view.sleep(500);		// 移動速度調整のためスリープ
		}
		*/
        return false;

    }

    /**
     *	プレス時処理
     */
    public void onShowPress(MotionEvent e)
	{
        DebugLog.printin("ShowPress");
    }

    /**
     *	シングルタップ時処理
     */
    public boolean onSingleTapUp(MotionEvent e)
	{
		// シングルタップアップ時には、タッチ操作として扱う
		TouchPosX_UP = (int)e.getX();
		TouchPosY_UP = (int)e.getY();
		view.TouchStatus = view.TouchStatus_TAP;
        return false;
    }

    /**
     * ダブルタップ時に呼ばれる
     * @param e
     * @return
     */
    public boolean onDoubleTap(MotionEvent e)
	{
        DebugLog.printin("DoubleTap");			//	ダブルタップは無効
        return false;
    }

    /**
     * ダブルタップイベント時(down,move,up含む)に呼ばれる
     * @param e
     * @return
     */
    public boolean onDoubleTapEvent(MotionEvent e)
	{
		DebugLog.printin("DoubleTapEvent");		// ダブルタップは無効
        return false;
    }

    /**
     *	シングルタップ時処理
     *	@param e
     *	@return
     */
    public boolean onSingleTapConfirmed(MotionEvent e)
	{
        DebugLog.printin("SingleTap");
        return false;
    }

	/**
	 *	アプリ再開時処理
	 */
	@Override
	public void onResume()
	{
		super.onResume();
        DebugLog.printin("onResume");

        //	ハンドラを再開させます。
		tickHandler=new TickHandler();
		tickHandler.sleep(0);

		// BGM再開
		if(MyUtil.mp_Bgm != null) {
			// 再生状況チェックをチェックし、再生中ならば、BGMを再生する
			if(!MyUtil.mp_Bgm.isPlaying()) {
				DebugLog.printin("mp_Bgm:MediaPlayer.start");
				MyUtil.mp_Bgm.start();
			}
		}

		// SE再開
		if( MyUtil.mp_Se != null) {
			// 再生状況チェックをチェックし、再生中ならば、SEを再生する
			if(!MyUtil.mp_Bgm.isPlaying()) {
				DebugLog.printin("mp_Se:MediaPlayer.start");
				MyUtil.mp_Se.start();
			}
		}
	}

	/**
	 *	アプリが一時停止時処理
	 */
	@Override
	public void onPause()
	{
		super.onPause();

		tickHandler=null;	//	ハンドラを停止させます。
		pauseBGM();			//	BGMの一時停止処理
		pauseSE();			//	SEの一時停止処理
	}

	/**
	 * アプリの終了ボタンが押された際と、他のActivityが起動された際に呼び出させる処理
	 */
	@Override
	public void onStop()
	{
		super.onStop();

		tickHandler=null;	//	ハンドラを停止させます。
		pauseBGM();			//	BGMの一時停止処理
		pauseSE();			//	SEの一時停止処理
	}

	/**
	 *  BGM停止処理
	 *  MediaPlayerのインスタンスチェックし、再生中なら一時停止する
	 */
	private void pauseBGM()
	{
		if(MyUtil.mp_Bgm != null) {
			if(MyUtil.mp_Bgm.isPlaying()) {
				MyUtil.mp_Bgm.pause();
			}
		}
	}

	/**
	 *  SE停止処理
	 *  MediaPlayerのインスタンスチェックし、再生中なら一時停止する
	 */
	private void pauseSE()
	{
		if(MyUtil.mp_Se != null) {
			if(MyUtil.mp_Se.isPlaying()) {
				MyUtil.mp_Se.pause();
			}
		}
	}

	/**
	 * アプリの終了ボタンが押された際に呼び出させる処理
	 */
	@Override
	public void onDestroy()
	{
		super.onDestroy();

		//	ハンドラを停止させます。
		tickHandler=null;

		// MediaPlayerのインスタンスチェックし、BGM再生中ならBGMを停止する
		if(MyUtil.mp_Bgm != null) {
			MyUtil.mp_Bgm.stop();
			MyUtil.mp_Bgm.release();
			MyUtil.mp_Bgm = null;
		}

		// MediaPlayerのインスタンスチェック し、SE再生中ならSEを停止する
		if(MyUtil.mp_Se != null) {
			MyUtil.mp_Se.stop();
			MyUtil.mp_Se.release();
			MyUtil.mp_Se = null;
		}
	}

	/**
	 * 定期的な処理を行うメソッド
	 */
	public void onTick(){
		//	以下で、描写処理が呼び出され、view.onDrawが実行されます。
		view.invalidate();
		if (tickHandler!=null) tickHandler.sleep(view.getSleep());
	}
	/**
	 * 定期処理ハンドラクラス Handlerを継承して、作成する。
	 */
	public class TickHandler extends Handler {
		//ハンドルメッセージ
		@Override
		public void handleMessage(Message msg) {
		    onTick();
		}

		//スリープ
		public void sleep(long delayMills) {
		    removeMessages(0);
		    sendMessageDelayed(obtainMessage(0),delayMills);
		}
	}
}
